#include "lcd1602.h"

LCD1602_T  lcd1602_t;

/*****************************************************************************
 �� �� ��: lcd1602_write
 ��������  : LCD1602Һ����д��
 �������  : **_data ����ʾ�ַ���ָ��
           _lenth  ����ʾ�ַ�������
 �������  : ��
 �� �� ֵ: ��
 �޸���ʷ     :
  1.��    ��   : 2019��03��03��
    ��    ��   : ΢Ц����
    �޸�����   : ����
*****************************************************************************/
void lcd1602_write(const INT8U* _data, INT16U _length, INT8U _flag)
{
    while(_length)
    {
        CLR_LCD1602_EN();
        SET_LCD1602_WRITE();
        if(LCD1602_CMD == _flag)
        {
            SET_LCD1602_COMD_MODE();
        }
        else if(LCD1602_DATA == _flag)
        {
            SET_LCD1602_DATA_MODE();
        }

        LCD1602_DATA_ODR = *_data;
        _data ++;
        _nop_();
        SET_LCD1602_EN();
        _nop_();
        CLR_LCD1602_EN();

        _length --;
    }

    return;
}

/*****************************************************************************
 �� �� ��: lcd1602_init
 ��������  : LCD1602Һ������ʼ������
 �������  : ��      
 �������  : ��
 �� �� ֵ: ��
 �޸���ʷ     :
  1.��    ��   : 2019��03��03��
    ��    ��   : ΢Ц����
    �޸�����   : ����
*****************************************************************************/
void lcd1602_init(void)
{
    INT8U lcd1602_init_cmd[] = {0x38, 0x0c, 0x06, 0x01, 0x80}; 
    
    lcd1602_write(lcd1602_init_cmd, sizeof(lcd1602_init_cmd), LCD1602_CMD);

    return;
}

/*****************************************************************************
 �� �� ��: lcd1602_init
 ��������  : LCD1602Һ������ʼ������
 �������  : _cgram_address   CGRAM��ַ  
           _code_pointer  �Զ����ַ���ַ
 �������  : ��
 �� �� ֵ: ��
 �޸���ʷ     :
  1.��    ��   : 2019��03��03��
    ��    ��   : ΢Ц����
    �޸�����   : ����
*****************************************************************************/
void lcd1602_write_cgram(INT8U _cgram_address, INT8U *_code_pointer)
{
    INT8U i;
        
    _cgram_address = (_cgram_address << 3) | 0x40;
    lcd1602_write(&_cgram_address, 1, LCD1602_CMD);
    for(i = 0; i < 8; i ++)
    {
        lcd1602_write(_code_pointer, 1, LCD1602_DATA);

        _code_pointer ++;
    }
}

/*****************************************************************************
 �� �� ��: lcd1602_setCursorPos
 ��������  : ����LCD1602Һ�������λ��
 �������  : _line   ��
           _row  ��
           _state���״̬ 
 �������  : ��
 �� �� ֵ: ��
 �޸���ʷ     :
  1.��    ��   : 2019��03��03��
    ��    ��   : ΢Ц����
    �޸�����   : ����
*****************************************************************************/
void lcd1602_setCursorPos(INT8U _line, INT8U _row, INT8U _state)
{
    INT8U lcd1602_cmd;
    lcd1602_cmd = (0x80 | _row) + (0x40 & (_line << 6));
    lcd1602_write(&lcd1602_cmd, 1, LCD1602_CMD);
    lcd1602_cmd = (0x0C | _state);
    lcd1602_write(&lcd1602_cmd, 1, LCD1602_CMD);
}


